package com.coc.ofmylistener.event;

import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;

public class DatabaseEventStore implements EventStore {

    private JdbcTemplate jdbcTemplate;

    @Override
    public void store(EventEntity event) {

    }

    public DatabaseEventStore(DataSource dataSource) throws SQLException {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
        this.jdbcTemplate.afterPropertiesSet();
    }

    @Override
    public EventEntityQueue getEventEntityQueue() {
        return null;//new ListCacheEventEntityQueue();
    }

  //  class ListCacheEventEntityQueue implements EventEntityQueue{

//        private List<EventEntity> cache;
//        private int cacheSize;
//        private int index;
//
//        private final ReentrantLock lock = new ReentrantLock();
//
//        public ListCacheEventEntityQueue(){}
//
//        protected List<EventEntity> doLoadMessage(){
//            return loadUnhandledEvent(600);
//        }
//
//        protected boolean tryLockMessage(String serialNo){
//            return updateState(serialNo, EventEntity.OPERATE_STATE, EventEntity.DEFAULT_STATE) > 0;
//        }
//
//        protected void setMessageProperty(EventEntity message){}
//
//        private void load(){
//            cache = doLoadMessage();
//            cacheSize = cache == null ? 0 : cache.size();
//            index = 0;
//        }
//
//        @Override
//        public EventEntity next() {
//
//            lock.lock();
//
//            try{
//
//                while (true){
//                    if (index < cacheSize){
//
//                        EventEntity returnObject = cache.get(index);
//                        String serialNo = returnObject.getIdentity();
//                        if (tryLockMessage(serialNo)){
//                            return returnObject;
//                        }
//
//                        index++;
//                    }else{
//                        load();
//                        if (index == cacheSize){
//                            return null;
//                        }
//                    }
//                }
//
//            }finally{
//                lock.unlock();
//            }
//        }
//
//        @Override
//        public void commit(String identity) {
//            updateState(identity, EventEntity.SUCCESS_STATE, EventEntity.OPERATE_STATE);
//        }
//
//        @Override
//        public void revers(String identity) {
//            updateState(identity, EventEntity.DEFAULT_STATE, EventEntity.OPERATE_STATE);
//        }
//
//        @Override
//        public void error(String identity) {
//            updateState(identity, EventEntity.FAIL_STATE, EventEntity.OPERATE_STATE);
//        }
  //  }


}
